#include "mainwindow.h"


void MainWindow::ReflashSerialPort(void)
{
    // 假设您的界面对象是 ui，且有一个名为 SerialSelect_box 的 QComboBox 控件
    QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
    QStringList portNames;

    foreach (const QSerialPortInfo &portInfo, ports) {
        portNames.append(portInfo.portName());
    }

    // 清空 QComboBox 中的所有项
    ui->SerialSelect_box->clear();

    // 现在portNames包含了所有可用串口的名称
    // 将所有串口名称添加到 QComboBox 中
    foreach (const QString &portName, portNames) {
        ui->SerialSelect_box->addItem(portName);
    }
}

int MainWindow::OpenSerial(QString com, QString baud, QString databit, QString stopbit, QString paritybit)
{
    if (serial->isOpen())
    {
        msgbox("已打开\n");
        return -7;
    }
    // 设置串口名称
    if (!com.isEmpty()) {
        serial->setPortName(com);
    } else {
        return -1;
    }

    // 设置波特率
    QSerialPort::BaudRate baudRate;
    bool ok;
    int baudRateValue = baud.toInt(&ok);
    if (ok) {
        baudRate = static_cast<QSerialPort::BaudRate>(baudRateValue);
        serial->setBaudRate(baudRate);
    } else {
        return -2;
    }

    // 设置数据位
    QSerialPort::DataBits dataBits = static_cast<QSerialPort::DataBits>(databit.toInt(&ok));
    if (!ok) {
        return -3;
    }
    serial->setDataBits(dataBits);

    // 设置停止位
    QSerialPort::StopBits stopBits = static_cast<QSerialPort::StopBits>(stopbit.toInt(&ok));
    if (!ok) {
        return -4;
    }
    serial->setStopBits(stopBits);

    // 设置校验位
    QSerialPort::Parity parity = static_cast<QSerialPort::Parity>(paritybit.toInt(&ok));
    if (!ok) {
        return -5;
    }
    serial->setParity(parity);

    // 设置流控制
    serial->setFlowControl(QSerialPort::NoFlowControl);

    // 打开串口
    if (serial->open(QIODevice::ReadWrite)) {
        // 串口打开成功
        // 可以在这里设置数据接收处理，例如使用readyRead()信号
    } else {
        return -6;
    }
    return 0;
}

int MainWindow::CloseSerial()
{
    if (serial->isOpen())
    {
        serial->close();
        msgbox("关闭成功\n");
    }
    else
        msgbox("串口未打开");
    return 0;
}
void MainWindow::SerialRead() {
    QByteArray data = serial->readAll();
    // 处理数据
    QString ShowData;
    QString RxData;
    QString HexString = data.toHex().toUpper();
    // 在每两个字符后添加空格
    for (int i = 0; i < HexString.length(); i += 3) {
        HexString.insert(i + 2, " "); // 从第i+2个字符的位置插入空格
    }
    // 十六进制处理
    if (ui->HexShow_checkBox->isChecked())
        RxData = QString("%1%2").arg(HexString).arg("\n");
    else
        RxData = QString::fromLocal8Bit(data);
    // 时间处理
    QDateTime currentDateTime = QDateTime::currentDateTime();
    if (ui->ShowTime_checkBox->isChecked() && \
            currentDateTime.toString("yyyy-MM-dd HH:mm:ss") != LastSerialReadTime.toString("yyyy-MM-dd HH:mm:ss"))
    {
        ShowData = QString("%1%2").arg(currentDateTime.toString("yyyy-MM-dd HH:mm:ss #############\n")).arg(RxData);
        ui->Receive_TextEdit->insertPlainText(ShowData);
        LastSerialReadTime = currentDateTime;
    }
    else
        ui->Receive_TextEdit->insertPlainText(RxData);
    if (ui->Find_checkBox->isChecked())
    {
        ChangeReceivePlainTextEditAllStringColor(ui->Receive_TextEdit);
        ChangeReceivePlainTextEditSubStringColor(ui->Receive_TextEdit, ui->Find_lineEdit);
    }
    // 显示总共接收到的字节数
    SerialRXTolalCnt += data.size();
    ui->RX->setText(QString("RX:%1").arg(SerialRXTolalCnt));
    // 获取滚动条的最大值
    int maximumScroll = ui->Receive_TextEdit->verticalScrollBar()->maximum();
    ui->Receive_TextEdit->verticalScrollBar()->setValue(maximumScroll-21);
    // 滚动到底部
    ui->Receive_TextEdit->verticalScrollBar()->setValue(ui->Receive_TextEdit->verticalScrollBar()->maximum());
}

void MainWindow::SerialWrite(QString *data)
{
    QByteArray dataBytes;
    if (ui->RN_checkBox->isChecked())
        dataBytes = data->toUtf8() + "\r\n";
    else
        dataBytes = data->toUtf8();

    int ret = serial->write(dataBytes);
    SerialTXTolalCnt += ret;
}

